package main

import (
	"context"
	"fmt"
	"github.com/coreos/etcd/clientv3"
	"time"
)

func main() {
	cli, err := clientv3.New(clientv3.Config{Endpoints: []string{"localhost:2379"},
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		fmt.Println(err)
	}
	kv := clientv3.NewKV(cli)
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	getResp, err := kv.Get(ctx, "/user/zhanglin")
	//获取一个目录所有的key： kv.Get(ctx, "/user/zhanglin"， clientv3.WithPrefix())
	defer cancel()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(getResp.Kvs[0])
	fmt.Println("当前最大的version:", getResp.Header.Revision) //etcd中最大的版本号

	// 也可以用如下方式来获取
	getOp := clientv3.OpGet("/user/zhanglin2")
	opResp, _ := kv.Do(ctx, getOp)
	fmt.Println(opResp.Get().Kvs[0])

	// 获取CreateVerion最小的那个key的信息
	getResp, err = kv.Get(ctx, "/user/", clientv3.WithFirstCreate()...)
	fmt.Println(getResp.Kvs[0])

	// 获取一个目录下所有的key的信息
	getResp, err = kv.Get(ctx, "/user/", clientv3.WithPrefix())
	fmt.Println("=================")
	for _, v := range getResp.Kvs {
		fmt.Println(v)
	}
}

// key:"/user/zhanglin" create_revision:2 mod_revision:53 version:12 value:"5"
// create_revision: 创建时生成的版本号，一旦创建以后的更新都不会改变这个值
// mod_revision: 事务的全局ID，多次更新可能不是连续递增的，如果两次更新期间有别的key更新，则会出现跳跃增加
// version: 该key被修改的次数，每修改一次加1
// value: key的值
// 创建一个新key时，create_revision={mod_revision}+1, mod_revision={mod_revision}+1, version=1
// 在事务的if判断中也是比较这几个字段
